package config

import (
	"fmt"
	"strconv"
	"strings"

	"gopkg.in/ini.v1"
)

// WindowPosition 窗口位置信息
type WindowPosition struct {
	Title   string `ini:"title"`   // 窗口标题
	Screen  int    `ini:"screen"`  // 屏幕索引
	X       int    `ini:"x"`       // X坐标
	Y       int    `ini:"y"`       // Y坐标
	Width   int    `ini:"width"`   // 窗口宽度
	Height  int    `ini:"height"`  // 窗口高度
	Pattern bool   `ini:"pattern"` // 是否为通配符模式
}

// Config 配置结构
type Config struct {
	WindowPositions []WindowPosition `ini:"-"` // 窗口位置列表
	GlobalPatterns  []string         `ini:"-"` // 全局通配符模式
}

// LoadConfig 从文件加载配置
func LoadConfig(filename string) (*Config, error) {
	cfg, err := ini.Load(filename)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}

	config := &Config{}

	// 加载窗口位置配置
	windowSection := cfg.Section("Windows")
	for _, key := range windowSection.Keys() {
		value := key.String()
		parts := strings.Split(value, ",")
		if len(parts) >= 6 {
			pos := WindowPosition{
				Title: parts[0],
			}

			// 解析屏幕索引
			if screen, err := strconv.Atoi(parts[1]); err == nil {
				pos.Screen = screen
			}

			// 解析坐标和尺寸
			if x, err := strconv.Atoi(parts[2]); err == nil {
				pos.X = x
			}
			if y, err := strconv.Atoi(parts[3]); err == nil {
				pos.Y = y
			}
			if width, err := strconv.Atoi(parts[4]); err == nil {
				pos.Width = width
			}
			if height, err := strconv.Atoi(parts[5]); err == nil {
				pos.Height = height
			}

			// 检查是否为通配符模式
			pos.Pattern = strings.Contains(pos.Title, "*") || strings.Contains(pos.Title, "?")

			config.WindowPositions = append(config.WindowPositions, pos)
		}
	}

	// 加载全局通配符模式
	patternSection := cfg.Section("GlobalPatterns")
	for _, key := range patternSection.Keys() {
		config.GlobalPatterns = append(config.GlobalPatterns, key.String())
	}

	return config, nil
}

// Save 保存配置到文件
func (c *Config) Save(filename string) error {
	cfg := ini.Empty()

	// 保存窗口位置配置
	windowSection := cfg.Section("Windows")
	for i, pos := range c.WindowPositions {
		keyName := fmt.Sprintf("window_%d", i)
		value := fmt.Sprintf("%s,%d,%d,%d,%d,%d",
			pos.Title, pos.Screen, pos.X, pos.Y, pos.Width, pos.Height)
		windowSection.Key(keyName).SetValue(value)
	}

	// 保存全局通配符模式
	patternSection := cfg.Section("GlobalPatterns")
	for i, pattern := range c.GlobalPatterns {
		keyName := fmt.Sprintf("pattern_%d", i)
		patternSection.Key(keyName).SetValue(pattern)
	}

	return cfg.SaveTo(filename)
}

// NewDefaultConfig 创建默认配置
func NewDefaultConfig() *Config {
	return &Config{
		WindowPositions: []WindowPosition{
			{
				Title:   "门禁通知",
				Screen:  0,
				X:       100,
				Y:       100,
				Width:   400,
				Height:  300,
				Pattern: false,
			},
		},
		GlobalPatterns: []string{
			"*通知*",
			"*门禁*",
		},
	}
}

// FindWindowPosition 查找窗口位置配置
func (c *Config) FindWindowPosition(title string) *WindowPosition {
	// 先查找精确匹配
	for i := range c.WindowPositions {
		if c.WindowPositions[i].Title == title && !c.WindowPositions[i].Pattern {
			return &c.WindowPositions[i]
		}
	}

	// 再查找通配符匹配
	for i := range c.WindowPositions {
		if c.WindowPositions[i].Pattern && c.matchPattern(c.WindowPositions[i].Title, title) {
			return &c.WindowPositions[i]
		}
	}

	// 最后查找全局通配符模式
	for _, pattern := range c.GlobalPatterns {
		if c.matchPattern(pattern, title) {
			// 创建新的位置配置
			pos := &WindowPosition{
				Title:   title,
				Screen:  0,
				X:       100,
				Y:       100,
				Width:   400,
				Height:  300,
				Pattern: true,
			}
			c.WindowPositions = append(c.WindowPositions, *pos)
			return pos
		}
	}

	return nil
}

// UpdateWindowPosition 更新窗口位置
func (c *Config) UpdateWindowPosition(title string, screen, x, y, width, height int) {
	// 查找现有配置
	for i := range c.WindowPositions {
		if c.WindowPositions[i].Title == title {
			c.WindowPositions[i].Screen = screen
			c.WindowPositions[i].X = x
			c.WindowPositions[i].Y = y
			c.WindowPositions[i].Width = width
			c.WindowPositions[i].Height = height
			return
		}
	}

	// 如果没找到，添加新配置
	pos := WindowPosition{
		Title:   title,
		Screen:  screen,
		X:       x,
		Y:       y,
		Width:   width,
		Height:  height,
		Pattern: false,
	}
	c.WindowPositions = append(c.WindowPositions, pos)
}

// matchPattern 检查标题是否匹配通配符模式
func (c *Config) matchPattern(pattern, title string) bool {
	// 简单的通配符匹配实现
	// 将 * 转换为 .*，将 ? 转换为 .
	regexPattern := strings.ReplaceAll(pattern, "*", ".*")
	regexPattern = strings.ReplaceAll(regexPattern, "?", ".")

	// 这里使用简单的字符串包含检查，实际项目中可以使用正则表达式
	if strings.Contains(pattern, "*") {
		parts := strings.Split(pattern, "*")
		for _, part := range parts {
			if part != "" && !strings.Contains(title, part) {
				return false
			}
		}
		return true
	}

	return title == pattern
}
